package luke.core.utils;

import javax.swing.*;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * QR码验证器类
 * 用于验证二维码文件的唯一标识，防止篡改
 */
public class QRCodeValidator {
    // 正确的二维码文件MD5哈希值 (更新为qr_code.png的MD5值)
    private static final String VALID_QR_CODE_MD5 = "15eb301f60e94d5dc8bf85be2dd2c020";
    
    // 二维码文件路径 (更新为png文件)
    private static final String QR_CODE_PATH = "/qr_code/qr_code.png";
    
    /**
     * 验证二维码文件是否正确
     * @return 如果二维码文件正确返回true，否则返回false
     */
    public static boolean validateQRCode() {
        try {
            // 获取二维码文件的输入流
            InputStream qrCodeStream = QRCodeValidator.class.getResourceAsStream(QR_CODE_PATH);
            if (qrCodeStream == null) {
                System.err.println("无法找到二维码文件: " + QR_CODE_PATH);
                return false;
            }
            
            // 计算文件的MD5哈希值
            String fileMD5 = calculateMD5(qrCodeStream);
            
            // 关闭输入流
            qrCodeStream.close();
            
            // 比较哈希值
            return VALID_QR_CODE_MD5.equals(fileMD5);
        } catch (Exception e) {
            System.err.println("验证二维码文件时发生错误: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 计算输入流的MD5哈希值
     * @param inputStream 输入流
     * @return MD5哈希值
     * @throws NoSuchAlgorithmException 如果不支持MD5算法
     * @throws IOException 如果读取输入流时发生错误
     */
    private static String calculateMD5(InputStream inputStream) throws NoSuchAlgorithmException, IOException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] buffer = new byte[8192];
        int bytesRead;
        
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            md.update(buffer, 0, bytesRead);
        }
        
        byte[] digest = md.digest();
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b));
        }
        
        return sb.toString();
    }
    
    /**
     * 显示验证失败对话框并退出程序
     */
    public static void showInvalidQRCodeDialogAndExit() {
        // 在事件调度线程中显示对话框
        SwingUtilities.invokeLater(() -> {
            JOptionPane.showMessageDialog(
                null,
                "请使用正版软件",
                "验证失败",
                JOptionPane.ERROR_MESSAGE
            );
            
            // 退出程序
            System.exit(1);
        });
    }
}